//encoding: utf-8
//author: yangsl
//last modified: 2017-01-22

//Epoller管理epoll，方法add和remove为增加、删除管理的sockfd
//方法getSockfds获取有接收请求或者是断开的sockfds，需要专门开一个线程来处理。
//Epoller需要两个配置参数：max_load和max_epoll_event，前者为管理的最大sockfd数，后者为getSockfds返回的最大sockfd数。

#pragma once

#include <list>
#include <sys/epoll.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/epoll.h>
#include <sys/wait.h>
#include <sys/un.h>
#include <stddef.h>

using std::list;

/**
 * @brief The Epoller class             Epoll封装简单使用
 */
class Epoller
{
public:
    Epoller(int max_load,int max_epoll_event);
    ~Epoller();
    /**
     * @brief add               添加需要监听的文件描述符
     * @param sockfd            需要操作的文件描述符
     */
    void add(int sockfd);

    /**
     * @brief remove            移出需要监听的文件描述符
     * @param sockfd            文件描述符
     */
    void remove(int sockfd);

    /**
     * @brief getSockfds        获取有响应的描述符队列
     * @param sockfds           有相应的描述符队列
     * @param timeout           超时时间
     */
    void getSockfds(list<int> &sockfds, int timeout=-1);            // 默认阻塞

private:
    int epollfd_,max_epoll_event_;
};
